// Package config 包含应用程序的配置初始化逻辑。
// 本文件用于加载配置文件，并初始化数据库和 Redis 客户端。
package config

import (
	"log" // 用于日志记录

	"github.com/spf13/viper" // Viper 是一个流行的 Go 配置管理库
)

// Config 定义了应用程序的配置结构体
type Config struct {
	App struct {
		Name string // 应用程序名称
		Port string // 应用程序监听的端口号
	}
	Database struct {
		Dsn          string // 数据库连接字符串
		MaxIdleConns int    // 数据库连接池的最大空闲连接数
		MaxOpenConns int    // 数据库连接池的最大打开连接数
	}
	Redis struct {
		Addr     string // Redis 服务器地址
		DB       int    // Redis 数据库编号
		Password string // Redis 连接密码
	}
}

// AppConfig 是全局配置实例
var AppConfig *Config

// InitConfig 加载配置文件并初始化数据库和 Redis 客户端
func InitConfig() {
	// 设置配置文件名和类型
	viper.SetConfigName("config")   // 配置文件名（不包括扩展名）
	viper.SetConfigType("yml")      // 配置文件类型
	viper.AddConfigPath("./config") // 配置文件所在目录

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		// 如果读取失败，记录错误日志并终止程序
		log.Fatalf("Error reading config file: %v", err)
	}

	// 初始化全局配置实例
	AppConfig = &Config{}

	// 将配置文件内容解析到 Config 结构体中
	if err := viper.Unmarshal(AppConfig); err != nil {
		// 如果解析失败，记录错误日志并终止程序
		log.Fatalf("Unable to decode into struct: %v", err)
	}

	// 初始化数据库和 Redis 客户端
	initDB()
	initRedis()
}
